package com.ruoyi.web.controller.tool;

import com.google.gson.Gson;
import org.apache.commons.logging.impl.WeakHashtable;

import java.util.*;

/**
 * @ClassName SellTicketRes
 * @Description TODO
 * @Author tuda
 * @Date 2023/7/25 14:57
 * @Version 1.0
 **/
public class SellTicketRes implements Runnable {

    private int ticketNum = 100;
    private boolean loop = true;

    /**
     * 使用synchronized实现线程同步，解决超卖
     */
    public synchronized void Sell() {
        if (ticketNum <= 0) {
            System.out.println("没有余票！");

            loop = false;
            return;
        }
        // 休眠卖票
        try {
            Thread.sleep(50);

        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println(Thread.currentThread().getName() + "购买一张票。" + "剩余票数：" + (--ticketNum));
    }

    @Override
    public void run() {
        while (true) {
            if (loop == false) {
                break;
            }
            Sell();
        }
    }

//    public static void main(String[] args) {
//        SellTicketRes sellTicketRes = new SellTicketRes();
//        new Thread(sellTicketRes, "用户1111").start();
//        new Thread(sellTicketRes, "用户2222").start();
//        new Thread(sellTicketRes, "用户3333").start();
//    }


    public static void Find_Num(int[] p, int dst) {
        for (int i = 0; i < p.length; i++){
            for (int j = 0; j <i; j++){
                if (i != j){
                    int sum = p[i] + p[j];
                    if (sum == dst){
                        System.out.println("目标元素下标："+i+",数值:"+p[i]);
                        System.out.println("目标元素下标："+j+",数值:"+p[j]);
                    }
                }
            }
        }
    }

    /**
     * 整数数组中，找出其中两个数相加的和等于目标值的下标
     */
    public static void findTwoSum(int[] arrs, int target) {
        // 目标是数组下标，所以键值对为<数值,数值对应数组下标>，这里要说一下，哈希表的查找的时间复杂度是O(1)
        HashMap<Integer, Integer> map = new HashMap<>();
        // 1.扫描一遍数组，加入哈希表，时间复杂度是O(n)
        for (int j = 0; j < arrs.length; j++) {
            map.put(arrs[j], j);
        }
        System.out.println("map："+new Gson().toJson(map));
        // 2.第二次扫描，目标值-当前值，差值作为key，看看map里有木有，没有就下一个循环，直到数组扫描完毕或找到value,所以最坏情况的时间复杂度是O(n)
        for (int i = 0; i < arrs.length; i++) {
            // 得到第二个数的值
            int two = target - arrs[i];
            // 如果存在第二个数的数组下标
            if (map.containsKey(two)) {
                System.out.println("目标元素下标："+i+", 数值："+two);
            }
        }
    }

    /**
     * 冒泡排序
     * @param arrs
     */
    public static void sort(int[] arrs){
        int a = arrs.length;
        for (int i = 0; i < a-1; i++) {
            System.out.println(arrs[i]);
            for (int j = 0; j < a-i-1; j++) {
                if(arrs[j] > arrs[j+1]){
                    int temp = arrs[j];
                    arrs[j] = arrs[j+1];
                    arrs[j+1] = temp;
                }
            }
        }
        System.out.println(new Gson().toJson(arrs));
    }

    public static void main(String[] args) {
        int[] a=new int[] {3, 1, 5, 2};
//        Find_Num(a, 3);
//        findTwoSum(a, 3);
        sort(a);

    }


}
